iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0
AI & Data

Rust 加 MLOps,你說有沒有搞頭?系列 第 23

[Day 23] - 資料處理和特徵工程 🔢 (中) | ML 系統設計 🏭

  • 分享至 

  • xImage
  •  

今日份 Ferris

今天要來談談特徵工程,Ferris 直接不當螃蟹了🤣
https://ithelp.ithome.com.tw/upload/images/20231008/20141304qAzFbrp1vj.jpg

特徵工程

昨天談到了關於資料本身的各個面向,而有了良好的訓練集之後,我們就可以開始思考如何對其進行特徵工程。

但提到特徵工程,我想還是很多孩子想問:

深度學習還需要做特徵工程嗎?

deep learning
*圖片來源:Week 1 – Lecture: History, motivation, and evolution of Deep Learning

雖然前年解釋過了,但上圖是大神 Yann LeCun 對機器學習與深度學習差別的解釋,這讓很多人 (與我) 誤會深度學習模型不需要特徵工程。
的確,深度學習模型可以自動學習特徵,但這並不意味著特徵工程就沒有必要了。

在資料集較小時,特徵工程仍然可以幫助模型提高性能。透過錯誤分析,我們可以了解模型的弱點,並設計特徵來彌補這些弱點。尤其是對於結構化資料,特徵工程可以幫助我們更好地理解數據的內在結構,從而設計出更有效的特徵。
因此,我們不能排斥特徵工程。即使是使用深度學習模型,也應該進行適當的特徵工程,以提高模型的性能。

以下是一些具體的例子:

  • 如果資料集很小,模型可能無法學習到足夠的特徵。在這種情況下,我們可以通過特徵工程來補充模型的學習。
  • 如果資料集存在噪聲或缺失值,特徵工程可以幫助我們去除噪聲和填補缺失值。
  • 如果資料集存在類別不平衡,特徵工程可以幫助我們解決類別不平衡問題。

雖然沒有幫助,但讓大家看看 Yoda LeCun:
https://ithelp.ithome.com.tw/upload/images/20231008/20141304OU3IaqfNYl.jpg
*From this X

處理缺失值

如上所述,在產品環境中進行特徵工程 (或説建立訓練集) 時最常遇到的應該就是處理缺失值了。
大家也都知道要處理缺失值,但可能不知道缺失值不是都一樣的,就像人的性格一樣,以下是缺失值的三種類型:

  • 非隨機缺失 (Missing not at random (MNAR)):缺失值的原因與真實值本身有關,就像是個傲嬌的人,故意不說話。
    例如高收入的受訪者不想透露他們的收入,因此收入數據缺失。
  • 隨機缺失 (Missing completely at random (MCAR)):缺失值的原因與另一個已觀察到的變量有關,就像是個內向的人,不喜歡表達自己。
    例如女性受訪者不喜歡透露自己的年齡,因此年齡數據缺失。
  • 完全隨機缺失 (Missing completely at random (MCAR)):缺失值沒有規律,就像是個健忘的人,什麼都記不住。

所以在處理缺失值時,需要根據不同的情況選擇不同的方法,一般通常會採取刪除或填補的方法來處理:

  • 刪除缺失值:刪除缺失值是最簡單的方法,但它會丟失數據,可能導致偏差。
    對於完全隨機缺失,通常就會採用刪除來處理。
  • 填補缺失值:填補缺失值是要估計缺失值並填補。有許多不同的填補方法,例如均值填補、中位數填補和眾數填補。
    對於非隨機缺失,可以嘗試找出缺失值的原因,然後根據原因進行處理,而隨機缺失則可以使用一些統計方法進行填補。

特徵工程

而在談到特徵工程時,我們可能更常會理解為設計新的特徵或變量來改進模型的性能。
特徵工程是一個複雜的過程,需要結合具體的任務和數據集來進行,以下是特徵工程的一些常見方法:

  • 合併特徵 (Feature Crossing):合併兩個或多個特徵以創建新的特徵,例如合併客戶的年齡和性別創建一個新的特徵「年齡段」。
  • 編碼特徵 (Encoding Categorical Features):將非數值特徵轉換為數值特徵。例如,將國籍編碼為數字。
  • 創建新的特徵:根據現有特徵創建新的特徵。例如,根據客戶的購買記錄創建一個新的特徵「客戶價值」。

特徵工程可以幫助我們提高模型的性能,但它也可能增加模型的複雜性,使模型更難解釋。因此,在進行特徵工程時需要謹慎。
事實上,如何設計良好的特徵是一個複雜的問題,沒有萬無一失的答案。
學習的最佳方式是通過經驗:嘗試不同的特徵並觀察它們如何影響模型的性能。
或是向專家學習,例如閱讀 Kaggle 競賽獲勝團隊如何設計其特徵以了解其技術和他們經歷的考慮因素非常有用。

特徵工程最佳實踐

由於當今的 ML 系統成功與否依然取決於其特徵,因此對於希望在產品中使用機器學習的孩子來說,投資時間和精力進行特徵工程非常重要。

特徵工程通常需要專業知識,而專業知識專家可能並不總是工程師,因此設計工作流程以允許非工程師參與該過程非常重要。
以下是一些特徵工程最佳實踐的總結:

  • 根據時間將資料分成訓練/驗證/測試集,而不是隨機進行。
  • 如果對資料進行過採樣 (oversample),請在拆分後進行。
  • 在拆分後,再對資料做縮放和標準化以避免數據洩漏 (Data Leakage)。
  • 使用僅來自訓練集的統計數據(而不是整個資料集)來縮放特徵和處理缺失值。
  • 了解資料的生成、收集和處理方式。如果可能,請讓領域專家參與其中。
  • 記錄資料的前世今生,詳細可以參考前一個系列文的 [Day 23] 資料旅程 — 好想出去玩 V1.0 ٩(●ᴗ●)۶
  • 了解特徵對模型的重要性 (Feature importance)。
  • 使用泛化良好的特徵。
  • 從模型中刪除不再有用的特徵。

有了良好的特徵集,我們就可以進入工作流程的下一部分:訓練機器學習模型。
在繼續之前,我必須再次強調,開始建模並不代表我們完成了資料處理或特徵工程。
在大多數現實世界的 ML 專案中,資料收集和特徵工程的過程會一直持續到模型投入生產,而我們也需要用新的資料來改善模型,所以再複習一次 ML 產品生命週期吧:
Life cycle
*圖片修改自 Introduction to Machine Learning in Production

上面說的是理論部分,明天還要探索 Rust 在資料處理與特徵工程時可以如何應用,明天見囉!
/images/emoticon/emoticon25.gif


上一篇
[Day 22] - 資料處理和特徵工程 🔢 (上) | ML 系統設計 🏭
下一篇
[Day 24] - 資料處理和特徵工程 🔢 (下) | Rust x Jupyter 資料工程 🦀
系列文
Rust 加 MLOps,你說有沒有搞頭?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言